package com.xxl.job.executor.svc;

import com.xxl.job.executor.entity.CronJob;
import com.xxl.job.executor.entity.CronJobById;
import com.xxl.job.executor.entity.Server;
import com.xxl.job.executor.dao.CronJobDao;
import com.xxl.job.executor.dao.ServerDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CronJobService {

    @Autowired
    private CronJobDao cronJobDao;

    @Autowired
    private ServerDao serverDao;

    /**
     * 保存或更新定时任务。
     *
     * @param ip       服务器IP
     * @param schedule 调度时间（可能是@reboot这样的特殊指令）
     * @param command  执行命令
     */
    public void saveOrUpdateCronJob(String ip, String schedule, String command) {
        // 首先检查服务器是否已经存在
        Server server = serverDao.findByIp(ip);

        if (server == null) {
            // 如果服务器不存在，则插入
            server = new Server();
            server.setIp(ip);
            server.setOwner("admin"); // 根据实际情况填写
            server.setSystemName("XT0080"); // 根据实际情况填写
            serverDao.insert(server);
        }
        server = serverDao.findByIp(ip);
        // 判断schedule是否以#开头，来设置status（0表示任务被注释掉，1表示任务生效）
        int status = schedule.startsWith("#") ? 0 : 1;
        // 保存或更新定时任务
        CronJob cronJob = cronJobDao.findByServerIdAndCommand(server.getId(), command);
        if (cronJob == null) {
            // 插入新任务
            cronJob = new CronJob();
            cronJob.setServerId(server.getId());
            cronJob.setSchedule(schedule); // 设置调度时间或特殊指令
            cronJob.setCommand(command);   // 设置命令
            cronJob.setStatus(status);          // 默认生效
            cronJobDao.insert(cronJob);
        } else {
            // 更新已有任务
            cronJob.setSchedule(schedule); // 更新调度时间
            cronJob.setStatus(status);          // 生效
            cronJobDao.update(cronJob);
        }
    }

    public CronJobById findById(Long jobId) {
        return cronJobDao.findById(jobId);
    }

    /**
     * 更新定时任务的状态
     *
     * @param jobId 任务ID
     * @param status 更新后的状态
     */
    public void updateCronJobStatus(Long jobId, int status) {
        CronJobById cronJob = cronJobDao.findById(jobId);
        if (cronJob != null) {
            cronJob.setStatus(status);
            cronJobDao.updateById(cronJob);
        } else {
            throw new RuntimeException("Cron job not found with ID: " + jobId);
        }
    }
}
